home *** CD-ROM | disk | FTP | other *** search
- /****************************************************************************
- *
- * null driver V0.0 (c)CopyRight 1988, Gunnar Nordmark. All Rights Reserved.
- *
- * null-handler Ver. 0.0 20-Jul-1988
- *
- * Gunnar Nordmark
- * Nora strand 5
- * 182 34 DANDERYD
- * SWEDEN
- *
- * |You may freely distribute this source as long as |
- * |the Copyright notice is left intact. |
- ***************************************************************************/
-
- #undef BADDR
- #define BADDR(x) ((APTR)((long)x << 2))
-
- #define ACTION_FINDINPUT 1005L
- #define ACTION_FINDOUTPUT 1006L
- #define ACTION_END 1007L
-
- #define DOS_FALSE 0L
- #define DOS_TRUE -1L
-
- /* My Globals */
-
- long SysBase;
- struct Process *myproc;
-
- _main()
- {
- extern void returnpkt(); /* sends back the packet */
- extern void returnpktplain(); /* use args in Res1 */
- extern struct DosPacket *taskwait();
-
- char *version = "Ver 0.0 (c) Gunnar Nordmark 1988";
- struct DosPacket *mypkt; /* a pointer to the dos packet */
- struct DeviceNode *mynode; /* our device node (parmpkt Arg3) */
- struct FileHandle *fh; /* a pointer to our file handle */
- long run = TRUE; /* handler main loop flag */
- int null_open = 0; /* null open count */
-
-
- /* Initializing the handler */
-
- myproc = (struct Process *)FindTask(0L);
- mypkt = taskwait(myproc); /* Wait for my startup message */
-
- /* I don't need the name or extra info passed in Arg1/2 */
-
- mynode = (struct DeviceNode *)BADDR(mypkt->dp_Arg3);
- mynode->dn_Task = &myproc->pr_MsgPort;
- returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
-
- /* done initial stuff, now for some work */
-
- while(run) {
- mypkt = taskwait(myproc);
-
- switch(mypkt->dp_Type) { /* find what action to perform */
-
- case ACTION_FINDINPUT:
- case ACTION_FINDOUTPUT:
-
- null_open++;
-
- fh = (struct FileHandle *)BADDR(mypkt->dp_Arg1);
- fh->fh_Arg1 = mypkt->dp_Type;
- fh->fh_Port = (struct MsgPort *)DOS_FALSE; /* not interactive */
-
- returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
- break;
-
- case ACTION_READ:
-
- returnpkt(mypkt, myproc, 0, mypkt->dp_Res2); /* zero-length=EOF */
- break;
-
- case ACTION_WRITE:
-
- mypkt->dp_Res1 = mypkt->dp_Arg3; /* tell em we wrote them all */
- returnpktplain(mypkt, myproc);
- break;
-
- case ACTION_END:
-
- if (--null_open == 0)
- run = 0;
-
- returnpkt(mypkt, myproc, DOS_TRUE, mypkt->dp_Res2);
- break;
-
- default:
-
- returnpkt(mypkt, myproc, DOS_FALSE, ERROR_ACTION_NOT_KNOWN);
- break;
- }
- } /* end while */
- mynode->dn_Task = FALSE;
- }
-